En este documento se presenta una introducción a la construcción de gráficos en R, usando los gráficos graphics y el paquete ggplot2.


¿Por qué hacer gráficos?

En el proceso de minería de datos la visualización de datos está presente en varias de sus etapas entre las principales están la exploración de los datos y la presentación de los resultados, los gráficos permiten, de forma intuitiva, encontrar y entender patrones, grupos o valores atípicos que puedan existir en los datos, una vez terminado el proceso de exploración o predicción los gráficos nos permiten comunicar los resultados a nuestra audiencia sin importar si esta tiene o no conocimientos en Minería de Datos.


Ejemplo de como comunicar los resultados de un análisis

Puedes descargar los datos utilizados para realizar estas gráficas en la siguiente dirección : http://rnotr.com/assets/files/ab3.csv


Como podemos ver en el ejemplo anterior, el resultado de un análisis exploratorio o predictivo puede ser presentado en gráficos si estos se realizan de forma correcta, aunque este tema se tocará a profundidad en el curso de visualización e Interpretación de Datos en esta semana se verán las pautas básicas para la creación de gráficos en R.

Paquetes disponibles en R

En R existen un gran cantidad de paquetes que nos permiten graficar datos entre los más utilizados están graphics el paquete nativo de R para la visualización de datos y ggplot2 un paquete desarrollado por Hadley Wickham basado en la teoría de la gramática de los gráficos o grammar of graphics y un gran favorito de muchos a la hora de realizar gráficos en R.

Paquete Graphics

Existe una gran cantidad de maneras de representar datos, cada una de ellas pensada para abordar un problema y tipo de dato en específico, en este curso veremos como crear algunos de estos gráficos así como su interpretación.

Scatter plot / Gráficos de dispersión

Este es uno de los métodos más clásicos para representar la relación entre dos variables numéricas, este funciona utilizando el sistema de coordenadas cartesiano, para ejemplificar este tipo de gráfico utilizaremos dos fuentes de datos ambas disponibles en R, la tabla de datos cars y la tabla de datos iris.

Primer plot.

Inicialmente para crear un gráfico de dispersión sólo es necesario indicarle a la función plot los valores para la coordenada de X y los valores para la coordenada Y.

plot(x = cars$dist, y = cars$speed) # tamaño de las etiquetas de los ejes.

Como podemos ver tenemos como resultado un gráfico que aunque útil es poco informativo, por suerte el paquete graphics nos permite dar modificar muchas de las propiedades de nuestro gráfico para facilitar su lectura e interpretación.

plot(x = cars$dist, 
     y = cars$speed,
     # Titulo principal
     main = "Relación entre la velocidad de un vehiculo y distancia requerida para el frenado", 
     xlab = "Velocidad (mph)", # etiqueta del eje x
     ylab = "Distancia de frenado (millas)", # etiqueta del eje y 
     xlim = c(0,120), # rango del eje x
     ylim = c(4,25),# rango del eje y
     col = "red",# color del los formas del gráfico
     pch = 19, # tipo de forma dle gráfico
     cex.main = .95, # tamaño del titulo
     cex.axis = .80, # tamaño de la escala
     cex.lab = .80) # tamaño de las etiquetas de los ejes.



existen una gran variedad de funciones que nos permiten agregar formas extra a nuestros gráficos, ya sean líneas, puntos, texto o polígonos.

plot(1:10,1:10,axes=FALSE,xlab="",ylab="")
polygon(runif(4,1,10),runif(4,1,10),col="lightblue")
points(runif(5,1,10),runif(5,1,10),cex=1.5,col="red")
points(runif(5,1,10),runif(5,1,10),pch="+",cex=1.7,col="green")
lines(1:10,runif(10,1,10),lty=2,lwd=2)
text(runif(5,1,10),runif(5,1,10),labels=c("uno","dos","tres","cuatro","cinco"),cex=1.7,col=rainbow(5))
abline(h=5,lty=4)
title("Gráfico Variado")
axis(1,labels=c("uno","tres","cinco","siete","nueve"),at=seq(1,10,by=2))
axis(2,labels=1:10,at=1:10)
legend(8,3,lty=c(1:3),col=rainbow(3),legend=c("uno","dos","tres"))

Se utiliza este primer tipo de gráfico para ejemplificar el como personalizar un gráfico ya que todos estos atributos funcionan de forma muy similar para los demás gráficos del paquete graphics.

Regresando a nuestro gráfico en este caso podemos observar como existe una relación entre la velocidad del vehículo y la distancia que es este requiere para frenar.

Pairs plot / matriz de gráficos de dispersión

Como se comentó anteriormente los gráficos de dispersión nos permiten encontrar relaciones entre las variables numéricas, no en todos los casos el problema tiene sólo dos variables, para crear un pairs plot la función a utilizar es la función pairs indicándole el nombre del la hoja de datos sobre la que va a trabajar.

pairs(iris)

Como podemos ver tenemos como resultado una matriz en donde podemos ver las relaciones entre todas la variables de nuestra tabla, en este caso al ser la variable Specie una variable cualitativa es recomendable eliminarla del gráfico.

pairs(iris[,1:4])

Aunque ya tenemos nuestro gráfico sólo hace falta verlo para notar que su lectura e interpretación no son nada sencillas de realizar, una mejora que podemos realizar es la utilización de colores para representar las distintas especies de flores dentro de los datos, para esto utilizaremos el paquete RColorBrewer, en la siguiente imagen podemos ver las diferente paletas de colore que nos ofrece el paquete.



Para obtener una paleta de colores utilizando el paquete RColorBrewer debemos indicarle la cantidad de colores que necesitamos y cual es la paleta que colores que deseamos utilizar, estos colores se representan utilizando código hexadecimal.

paleta <-  brewer.pal(3, "Set1")
paleta
[1] "#E41A1C" "#377EB8" "#4DAF4A"

Al tener 150 observaciones en la tabla de datos debemos indicar el color con el que se va a presentar a cada una, una forma de hacerlo es utilizando la variable Specie.

iris$Species
 [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
 [ reached getOption("max.print") -- omitted 100 entries ]
Levels: setosa versicolor virginica
tipo  <- as.numeric(iris$Species)
tipo
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[36] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [ reached getOption("max.print") -- omitted 100 entries ]
colores <- paleta[tipo]
colores
 [1] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
 [8] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[15] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[22] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[29] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[36] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[43] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[50] "#E41A1C"
 [ reached getOption("max.print") -- omitted 100 entries ]
pairs(iris[,1:4],
     # Titulo principal
     main = "Relación entre las variables largo y ancho del sepalo y petalo 
     para las variedades de flor setosa, versicolor y virginica.", 
     pch = 21, # Tipo de la forma   
     cex.main = .95, # Tamaño del título
     bg = colores) # Colores por especie.

Como podemos ver la lectura del gráfico mejora considerablemente ya que hora sabemos cuantos grupos existen en los datos, por último agregaremos una leyenda que nos permite indicar que color representa a que especie.

pairs(iris[,1:4],
     # titulo principal
     main = "Relación entre las variables largo y ancho del sepalo y petalo 
     para las variedades de flor setosa, versicolor y virginica.", 
     pch = 21, # tipo de la forma   
     cex.main = .95, # tamaño del titulo
     bg = colores, # colores para las especies de flores
     oma = c(7, 3, 7, 3)) # hacemos espacio extra (abajo,izquierda,arriba,derecha) para agregar la leyenda


legend("bottom", # leyenda en la perte inferior
       title = "Especies :", # titulo de la leyenda
       legend = as.character(unique(iris$Species)), # nombres de los grupos
       fill = paleta, # colores de la leyenda
       horiz = TRUE, # leyenda de forma horizontal
       cex = .7, # tamaño del titulo
       xpd = T,
       inset = -0.1) # ubicación de la leyenda

Existen también la posibilidad de realizar gráficos de dispersión en 3 dimensiones esto nos permite identificar con mayor facilidad los grupos que existan en nuestros datos si se seleccionan correctamente la variables a utilizar y el ángulo desde el que se observaran los datos.

library(scatterplot3d) # paquete para realizar los gráficos en 3D
par(oma = c(3,2,1,2)) # se hace espacio extra para agregar la leyenda
scatterplot3d(x = iris$Petal.Width, # eje x
              y = iris$Sepal.Length, # eje y
              z = iris$Sepal.Width,  # eje z
              xlab = "Ancho Del Petalo",
              ylab = "Largo Del Sepalo",
              zlab = "Ancho Del Sepalo",
              bg = colores,
              pch = 21,
              angle = 190, # angulo desde el que se obervan los datos.
              main = "Dispersión de los individuos por largo del sepalo,
              ancho del petalo y ancho del sepalo.",
              cex.main = 1) # tamaño del titulo

legend("bottom", # ubicacion de la leyenda
      legend = levels(iris$Species), # nombres de los grupos
      col =  paleta, # colores
      pch = 19, # tipo de forma
      inset = -0.4, 
      xpd = T, 
      horiz = TRUE)

Como podemos ver en el gráfico la dispersión de los datos es algo confusa, podemos intentar encontrar un mejor angulo.

par(oma = c(3,2,1,2))
scatterplot3d(x = iris$Petal.Width, 
              y = iris$Sepal.Length, 
              z = iris$Sepal.Width, 
              xlab = "Ancho Del Pétalo",
              ylab = "Largo Del Sépalo",
              zlab = "Ancho Del Sépalo",
              bg = colores,
              pch = 21,
              angle = 50, # cambia el ángulo del gráfico
              main = "Dispersión de los individuos por largo del sépalo,
              ancho del pétalo y ancho del sépalo.",
              cex.main = 1)

legend("bottom", legend = levels(iris$Species),
      col =  paleta, 
      pch = 19, 
      inset = -0.4, 
      xpd = T, 
      horiz = TRUE)

Como vemos desde el ángulo correcto se pueden identificar tres grupos y aunque existe algo de confusión entre los grupos versicolor y virginica estos pueden separarse con un error de clasificación bastante pequeño.


Bar chars / gráfico de barras

En los dos gráficos anteriores están pensados para representar datos numéricos, los gráficos de barras nos permiten representar tanto variables cualitativas como cuantitativas, para esto caso utilizaremos un dataset que califica la obra de diversos pintores clásicos en base a su composición, dibujo, color, expresión ademas de indicar a que escuela pertenecieron.

library(MASS)
data("painters")
head(painters)
              Composition Drawing Colour Expression School
Da Udine               10       8     16          3      A
Da Vinci               15      16      4         14      A
Del Piombo              8      13     16          7      A
Del Sarto              12      16      9          8      A
Fr. Penni               0      15      8          0      A
Guilio Romano          15      16      4         14      A

Lo primero a tomar en cuenta al utilizar la función barplot es que en esta a diferencia de las que vimos anteriormente espera recibir una matriz y no una hoja de datos, para convertir nuestra hoja de datos en una matriz podemos utilizar el comando as.matrix, para poder ver los resultados con mayor claridad no graficaremos todos los datos.

Calificaciones del primer artista de la lista.
datos <- as.matrix(painters[1,1:4]) # calificaciones del primer artista.
datos
         Composition Drawing Colour Expression
Da Udine          10       8     16          3
barplot(datos,
        main = "Calificaciones para el artista : Da Udine",
        cex.main = 1, # tamaño del titulo
        ylab = "Calificación")


En la siguiente gráfica nuestro objetivo será graficar las 4 calificaciones de 5 artistas, por lo que seleccionamos los datos y los convertimos en una matriz.

datos <- as.matrix(painters[1:5, 1:4]) # se seleccionan los primeros 5 pintores de la tabla 
datos
           Composition Drawing Colour Expression
Da Udine            10       8     16          3
Da Vinci            15      16      4         14
Del Piombo           8      13     16          7
Del Sarto           12      16      9          8
Fr. Penni            0      15      8          0

En el gráfico las barras representan a las variables, como podemos ver los datos a representar que son observaciones de nuestra tabla (filas) y no columnas (variables), una forma sencilla de solucionar esto es transponiendo la matriz de datos.

datos <- t(datos) # se transpone la matriz 
datos
            Da Udine Da Vinci Del Piombo Del Sarto Fr. Penni
Composition       10       15          8        12         0
Drawing            8       16         13        16        15
Colour            16        4         16         9         8
Expression         3       14          7         8         0
colores <- brewer.pal(4, "Set1")

par(mar = c(4,6,4,6))
barplot(datos,
        main = "Califiacciones de artistas clasicos hechas por el critico Roger de Piles",
        cex.main = 1,
        cex.names = .7,
        ylab = "Calificación",
        col = colores,
        beside = TRUE,
        legend.text = T,
        args.legend = list(x = "right", 
                           bty = "n", 
                           inset = c(-0.25, 0), 
                           xpd = TRUE, 
                           title = "Categorias : "),
        border = "white")

Como podemos ver en la gráfica al tener varios individuos estos son agrupados en pequeños gráficos independientes donde se pueden observar las diferentes variables, existen también una forma de representar los datos en forma de pila donde todas las variables se representan en una sola barra.

colores <- brewer.pal(4, "Set1")

par(mar = c(4,6,4,6))
barplot(datos,
        main = "Califiacciones de artistas clasicos hechas por el critico Roger de Piles",
        cex.main = 1,
        cex.names = .7,
        ylab = "Calificación",
        col = colores,
        legend.text = T,
        args.legend = list(x = "right",
                           bty = "n", 
                           inset = c(-0.30,0), 
                           xpd = TRUE, title = "Categorias : "),
        
        border = "white")

En la siguiente gráfica nuestro objetivo será graficar una variable que no es numérica.

datos <- painters$School
datos
 [1] A A A A A A A A A A B B B B B B C C C C C C D D D D D D D D D D E E E
[36] E E E E F F F F G G G G G G G
 [ reached getOption("max.print") -- omitted 4 entries ]
Levels: A B C D E F G H

Al no ser nuestra variable numérica tenemos que realizar un conteo de nuestra variable para esto podemos utilizar la función table.

datos <- table(datos)
datos
datos
 A  B  C  D  E  F  G  H 
10  6  6 10  7  4  7  4 
datos <- t(datos)
datos
      datos
        A  B  C  D  E  F  G  H
  [1,] 10  6  6 10  7  4  7  4
# datos <- t(table(painters$School))
barplot(datos)


Aunque ya tenemos la gráfica es recomendable hacer algunos cambios que faciliten la lectura e interpretación.

escuelas <-c("Renaissance","Mannerist","Seicento","Venetian","Lombard","Sixteenth Century","Seventeenth Century","French")
par(mar = c(4,6,4,6))
barplot(datos,
        main = "Distribución de los pintores calificados segun la escuela a la que pertenecen",
        cex.main = 1,
        names = escuelas,
        horiz = T,
        cex.names = .6,
        las = 1,
        border = "white")


Pie plot / gráfico de pastel

Este es junto con el gráfico de barras uno de los tipos de gráficos más icónicos de la estadística, formado con un círculo que se divide en múltiples porciones (como un pastel) utilizado normalmente para representar porcentajes o proporciones.

La función para crear gráficos de pastel en el paquete gráficos se llama pie, entre sus principales parámetros están:

  • x = valores
  • labels = etiquetas de las variables
grupos <- c(18, 30, 32, 10, 10)
etiquetas <- c("A", "B", "C", "D", "F")
colores <- brewer.pal(5, "Blues")
pie(x = grupos, labels = etiquetas, col = colores)

Para este ejemplo se tomaran al azar 75 observaciones de la tabla de datos iris.

grupos <- table(sample(iris$Species,75))
grupos

    setosa versicolor  virginica 
        30         20         25 

Como vemos además de los parámetros antes indicados podemos enviarle el resultado del comando table, mejorar la interpretación del gráfico es recomendable ordenar las variables antes de realizar el gráfico, a continuación se ordenan las variables las etiquetas y se les agrega el símbolo de porcentaje “%”.

orden <- order(grupos)
orden
[1] 2 3 1
grupos <- grupos[orden]
grupos

versicolor  virginica     setosa 
        20         25         30 
etiquetas <- round(grupos * 100 / sum(grupos),2)
etiquetas

versicolor  virginica     setosa 
     26.67      33.33      40.00 
etiquetas <- paste0(etiquetas,"%")
etiquetas
[1] "26.67%" "33.33%" "40%"   
colores <- brewer.pal(3, "Greens")
pie(x = grupos[orden], 
    labels = etiquetas,
    col = colores,
    main = "Distribución de las especies en la tabla de datos iris")

legend("topleft",
       legend = names(grupos), 
       cex = 1, 
       fill = colores, 
       title = "Especie :")


Histogram / Histograma

Este tipo de gráfica es utilizada para visualizar la frecuencia con la que se distribuyen los datos, normalmente se presenta como un gráfico de barras donde el área de la gráfica representa la frecuencia de los valores representados, la función utilizada para crear un historial en R es llama hist

mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
 [ reached getOption("max.print") -- omitted 28 rows ]
hist(mtcars$mpg)

color <- brewer.pal(3,"Dark2")
hist(mtcars$mpg,
     main = "Distribución de 32 vehiculos segun su consumo de combustible
     según Motor Trend US magazine para modelos 1973 - 1974",
     xlab = "Rendimiento de combustible Millas/Galon",
     ylab = "Frecuencia",
     col = color[1])


En el siguiente gráfico se muestra el como puede leerse un este tipo de gráfico.

Otro uso frecuente de los histogramas es ver la distribución de probabilidad de los datos y compararlo contra una distribución normal.

color <- brewer.pal(3,"Dark2")
hist(mtcars$mpg,
     prob = TRUE, # se grafica la distribución de probabilidad.
     main = "Distribución de 32 vehiculos segun su consumo de combustible
     según Motor Trend US magazine para modelos 1973 - 1974",
     xlab = "Rendimiento de combustible (Millas/Galon)",
     ylab = "Frecuencia",
     col = color[1])

lines(density(mtcars$mpg), col = color[2], lwd = 2) # densidad de los datos
lines(density(mtcars$mpg, adjust = 2), lty = "dotted", col = color[3], lwd = 2) # distribución normal


Box plot / gráfico de caja

Este tipo de gráfico representa en base a cuartiles las distribución de frecuencias e indica los datos atípicos o extremos.

boxplot(iris[,1:4],
        col = color[1],
        outcol = "black",
        outpch = 19,
        main = "Valores atípicos para la tabla de datos iris")

par(mar = c(3,8,3,2))
boxplot(iris[,1:4],
        col = color[1],
        outcol = "black",
        outpch = 19,
        main = "Valores atípicos para la tabla de datos iris",
        names = c("Largo de sepalo","Ancho del sepalo","Largo del petalo","Ancho del petalo"),
        horizontal = T,
        las = 1,
        cex.names = 1)



Cor plot / gráficos de correlación

Este tipo de gráfico nos permite determinar de forma visual si existe correlación entre nuestras variables, para esto utilizaremos la función cor para calcular la matriz de correlaciones y la función corrplot del paquete corrplot para graficarlo.

library(corrplot)
correlaciones <- cor(iris[,-5])
correlaciones 
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000
corrplot(correlaciones)

corrplot(correlaciones, 
         method = "color",
         title = "Correlación entre las variables de la tabla iris",
         tl.cex = .6,
         tl.srt = 0,
         mar = c(1,1,2,1))


Paquete ggplot2

Ggplot2 nos plantea un paradigma diferente en el desarrollo de visualizaciones basadose en la teoría de la “gramática de los gráficos”, donde en lugar de construir el gráfico lo que se hacer es describir cuales son los componentes que no forman.

library(ggplot2)
ggplot()

Gráfico de dispersión

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length , y = Sepal.Width))

ggplot(data = iris) +
  geom_point(mapping = aes(x = Sepal.Length , y = Sepal.Width, color = Species))

ggplot(data = iris) +
  geom_point(mapping = aes(x = iris$Sepal.Length , y = iris$Sepal.Width, color = Species)) +
  labs(title = "Dispersión de las especies de la flores setosa virginica \n y versicolor según el largo y ancho de su sépalo",
       x = "Largo del sépalo",
       y = "Ancho del sépalo",
       color = "Especies :") +
  theme(plot.title = element_text(hjust = 0.5)) + 
  theme_bw()

Matriz de “dispersión”

library(GGally)
ggpairs(data = iris, columns = 1:4, 
        title = "Relación entre las variables largo y ancho del sépalo y pétalo \n para las variedades de flor setosa,versicolor y virginica", 
        mapping = aes(color = Species)) + 
        theme_bw()

Gráfico de barras

library(reshape2)
iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa
6            5.4         3.9          1.7         0.4     setosa
7            4.6         3.4          1.4         0.3     setosa
8            5.0         3.4          1.5         0.2     setosa
9            4.4         2.9          1.4         0.2     setosa
10           4.9         3.1          1.5         0.1     setosa
 [ reached getOption("max.print") -- omitted 140 rows ]
iris2 <- melt(iris, id.vars="Species")
iris2
       Species     variable value
1       setosa Sepal.Length   5.1
2       setosa Sepal.Length   4.9
3       setosa Sepal.Length   4.7
4       setosa Sepal.Length   4.6
5       setosa Sepal.Length   5.0
6       setosa Sepal.Length   5.4
7       setosa Sepal.Length   4.6
8       setosa Sepal.Length   5.0
9       setosa Sepal.Length   4.4
10      setosa Sepal.Length   4.9
11      setosa Sepal.Length   5.4
12      setosa Sepal.Length   4.8
13      setosa Sepal.Length   4.8
14      setosa Sepal.Length   4.3
15      setosa Sepal.Length   5.8
16      setosa Sepal.Length   5.7
 [ reached getOption("max.print") -- omitted 584 rows ]
ggplot(data=iris2) +
 geom_bar(aes(x = Species, y = value, fill = variable), stat="identity", position="dodge") +
 labs(title = "Ancho y largo del sepalo y petalo", 
      subtitle = "para las variedades de flores setona, versicolor y virginica",
      x = "Especies", 
      y = "Valores", 
      fill = "Tipo de flor :",
      caption = "Fuente : tabla de datos iris") + 
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5)) 

Gráfico de pastel

library(reshape2)
iris2 <- melt(iris, id.vars = "Species")
iris2
       Species     variable value
1       setosa Sepal.Length   5.1
2       setosa Sepal.Length   4.9
3       setosa Sepal.Length   4.7
4       setosa Sepal.Length   4.6
5       setosa Sepal.Length   5.0
6       setosa Sepal.Length   5.4
7       setosa Sepal.Length   4.6
8       setosa Sepal.Length   5.0
9       setosa Sepal.Length   4.4
10      setosa Sepal.Length   4.9
11      setosa Sepal.Length   5.4
12      setosa Sepal.Length   4.8
13      setosa Sepal.Length   4.8
14      setosa Sepal.Length   4.3
15      setosa Sepal.Length   5.8
16      setosa Sepal.Length   5.7
 [ reached getOption("max.print") -- omitted 584 rows ]
iris3 <- iris[sample(1:nrow(iris), 110), ]
quan <- as.vector(table(iris3$Species))
pos <- cumsum(quan) - quan/2
quantity <- data.frame(Species = c("setosa", "versicolor", "virginica"), 
                       quantity = quan, 
                       position = pos) 
quantity
     Species quantity position
1     setosa       33     16.5
2 versicolor       38     52.0
3  virginica       39     90.5
ggplot(iris3, aes(x=factor(1), fill=Species)) + 
  geom_bar(width=1) + 
  geom_text(data=quantity, 
            aes(x=factor(1), 
                y=position, 
                label=quantity) , 
            size=5) + 
  labs(x="", y="") + 
  coord_polar(theta="y")

Histograma y gráfico de dispersión

ggplot(data=iris, aes(x = Sepal.Width)) +
geom_histogram(binwidth = 0.2, color = "black", fill = "steelblue", aes(y = ..density..)) +
  geom_density(stat = "density", alpha = I(0.2), fill = "blue") +
  xlab("Ancho del sepalo") +  
  ylab("Densidad") + 
  ggtitle("Histograma y curva de densidad")

Temas

Existen una serie de temas que podemos aplicar a nuestros gráficos para mejorar su aspecto.

ggplot(mpg, aes(x = class , y= hwy)) + 
scale_x_discrete() +
geom_jitter(aes(color = class, x = class), 
            position = position_jitter(width = .05), alpha = 0.5) +
geom_boxplot(aes(color = class), outlier.colour = NA, position = "dodge") +
xlab("Clase") + ylab("Millas por galón")

library(ggthemes)

ggplot(mpg, aes(x = class , y= hwy)) + 
scale_x_discrete() +
geom_jitter(aes(color = class, x = class), 
            position = position_jitter(width = .05), alpha = 0.5) +
geom_boxplot(aes(color = class), outlier.colour = NA, position = "dodge") +
labs(x ="Clase", y = "Millas por galón", color = "Clase") +
theme_fivethirtyeight()+
scale_colour_few()

library(ggthemes)

ggplot(mpg, aes(x = class , y= hwy)) + 
scale_x_discrete() +
geom_jitter(aes(color = class, x = class), 
            position = position_jitter(width = .05), alpha = 0.5) +
geom_boxplot(aes(color = class), outlier.colour = NA, position = "dodge") +
labs(x ="Clase", y = "Millas por galon", color = "Clase") +
theme_wsj() +
  scale_colour_pander()


FIN DEL DOCUMENTO